package org.jupiter.blog.service.service.impl;

import org.jupiter.blog.api.convertor.JupiterTagStructConvertor;
import org.jupiter.blog.api.domain.JupiterTag;
import org.jupiter.blog.api.dto.JupiterTagDTO;
import org.jupiter.blog.service.mapper.JupiterTagMapper;
import org.jupiter.blog.service.service.JupiterTagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

@Service
public class JupiterTagServiceImpl implements JupiterTagService {

	@Autowired
	private JupiterTagMapper tagMapper;

	@Autowired
	private JupiterTagStructConvertor jupiterTagStructConvertor;

	@Override
	public JupiterTagDTO getById(String uuid) {
		JupiterTag tag = tagMapper.selectByUuid(uuid);
		return jupiterTagStructConvertor.toDto(tag);
	}

	@Override
	public List<JupiterTagDTO> getAll() {
		List<JupiterTag> tags = tagMapper.selectAll();
		return tags.stream()
				.map(jupiterTagStructConvertor::toDto)
				.collect(Collectors.toList());
	}

	@Override
	public List<JupiterTagDTO> getByPage(JupiterTagDTO queryDTO) {
		int offset = (queryDTO.getPage() - 1) * queryDTO.getSize();
		List<JupiterTag> tags = tagMapper.selectByPage(
				queryDTO.getName(), queryDTO.getColor(), queryDTO.getIsActive(), offset, queryDTO.getSize()
		);
		return tags.stream()
				.map(jupiterTagStructConvertor::toDto)
				.collect(Collectors.toList());
	}

	@Override
	public long getCount(JupiterTagDTO queryDTO) {
		return tagMapper.countByQuery(queryDTO.getName(), queryDTO.getColor(), queryDTO.getIsActive());
	}

	@Override
	@Transactional
	public void create(JupiterTagDTO dto) {
		JupiterTag tag = jupiterTagStructConvertor.toEntity(dto);
		if (!StringUtils.hasText(tag.getUuid())){
			tag.setUuid(UUID.randomUUID().toString());
		}
		tag.setCreateTime(LocalDateTime.now());
		tag.setUpdateTime(LocalDateTime.now());
		if (tag.getIsActive() == null) {
			tag.setIsActive(true);
		}
		tagMapper.insert(tag);
	}

	@Override
	@Transactional
	public void update(JupiterTagDTO dto) {
		JupiterTag tag = jupiterTagStructConvertor.toEntity(dto);
		tag.setUuid(dto.getUuid());
		tag.setUpdateTime(LocalDateTime.now());
		tagMapper.updateByUuidSelective(tag);
	}

	@Override
	@Transactional
	public void delete(String uuid) {
		tagMapper.deleteByUuid(uuid);
	}

	@Override
	@Transactional
	public void updateSort(String uuid, Integer sort) {
		JupiterTag tag = new JupiterTag();
		tag.setUuid(uuid);
		tag.setSort(sort);
		tag.setUpdateTime(LocalDateTime.now());
		tagMapper.updateByUuidSelective(tag);
	}

	@Override
	public List<JupiterTagDTO> getActiveTags() {
		List<JupiterTag> tags = tagMapper.selectActiveTags();
		return tags.stream()
				.map(jupiterTagStructConvertor::toDto)
				.collect(Collectors.toList());
	}

	@Override
	public List<JupiterTagDTO> getTagsByArticleId(String articleId) {
		List<JupiterTag> tags = tagMapper.selectByArticleId(articleId);
		return tags.stream()
				.map(jupiterTagStructConvertor::toDto)
				.collect(Collectors.toList());
	}
}
